package com.ruoyi.student.service.impl;

import com.ruoyi.common.utils.DateUtils;
import com.ruoyi.student.domain.SysRegistryTime;
import com.ruoyi.student.mapper.SysRegistryTimeMapper;
import com.ruoyi.student.service.ISysRegistryTimeService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.format.DateTimeFormatter;
import java.util.Date;
import java.util.List;

/**
 * 注册时间段配置Service业务层处理
 *
 * @author ruoyi-mate
 * @date 2025-08-29
 */
@Service
public class SysRegistryTimeServiceImpl implements ISysRegistryTimeService {
    private static final Logger log = LoggerFactory.getLogger(SysRegistryTimeServiceImpl.class);
    @Autowired
    private SysRegistryTimeMapper sysRegistryTimeMapper;

    // 时间格式化器
    private static final DateTimeFormatter DATE_TIME_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");

    /**
     * 查询注册时间段配置
     *
     * @param id 注册时间段配置主键
     * @return 注册时间段配置
     */
    @Override
    public SysRegistryTime selectSysRegistryTimeById(Long id) {
        return sysRegistryTimeMapper.selectSysRegistryTimeById(id);
    }

    /**
     * 查询最新的注册时间段配置
     *
     * @return 注册时间段配置
     */
    @Override
    public SysRegistryTime selectLatestRegistryTime() {
        return sysRegistryTimeMapper.selectLatestRegistryTime();
    }

    /**
     * 判断当前时间是否在注册时间段内
     *
     * @return true-在时间段内，false-不在时间段内
     */
    @Override
    public boolean isInRegistryTime() {
        SysRegistryTime registryTime = selectLatestRegistryTime();
        if (registryTime == null) {
            log.warn("未查询到注册时间段配置，默认不允许注册");
            return false;
        }

        LocalDateTime startTime = registryTime.getStartTime();
        LocalDateTime endTime = registryTime.getEndTime();
        if (startTime == null || endTime == null) {
            log.error("注册时间段配置不完整（id={}），startTime或endTime为null", registryTime.getId());
            return false;
        }

        LocalDateTime now = LocalDateTime.now();
        boolean inTime = (now.isAfter(startTime) || now.isEqual(startTime))
                && (now.isBefore(endTime) || now.isEqual(endTime));

        log.debug("当前时间：{}，注册时间段：{} - {}，是否在范围内：{}",
                now.format(DATE_TIME_FORMATTER),
                startTime.format(DATE_TIME_FORMATTER),
                endTime.format(DATE_TIME_FORMATTER),
                inTime);
        return inTime;
    }

    /**
     * 获取注册时间段描述
     *
     * @return 时间段描述
     */
    @Override
    public String getRegistryTimeDesc() {
        SysRegistryTime registryTime = selectLatestRegistryTime();
        if (registryTime == null) {
            return "未配置注册时间";
        }

        LocalDateTime startTime = registryTime.getStartTime();
        LocalDateTime endTime = registryTime.getEndTime();
        if (startTime == null || endTime == null) {
            return "注册时间配置不完整";
        }

        return startTime.format(DATE_TIME_FORMATTER) +
                " 至 " +
                endTime.format(DATE_TIME_FORMATTER);
    }

    /**
     * 查询注册时间段配置列表
     *
     * @param sysRegistryTime 注册时间段配置
     * @return 注册时间段配置
     */
    @Override
    public List<SysRegistryTime> selectSysRegistryTimeList(SysRegistryTime sysRegistryTime) {
        return sysRegistryTimeMapper.selectSysRegistryTimeList(sysRegistryTime);
    }

    /**
     * 新增注册时间段配置
     *
     * @param sysRegistryTime 注册时间段配置
     * @return 结果
     */
    @Override
    public int insertSysRegistryTime(SysRegistryTime sysRegistryTime) {
        // 优先使用框架工具类获取当前时间（若存在）
        // LocalDateTime 转 Date
        Date createTime = Date.from(
                LocalDateTime.now()
                        .atZone(ZoneId.systemDefault())
                        .toInstant()
        );
        sysRegistryTime.setCreateTime(createTime); // 此时与父类 Date 类型匹配
        return sysRegistryTimeMapper.insertSysRegistryTime(sysRegistryTime);
    }

    /**
     * 修改注册时间段配置
     *
     * @param sysRegistryTime 注册时间段配置
     * @return 结果
     */
    @Override
    public int updateSysRegistryTime(SysRegistryTime sysRegistryTime) {
        // LocalDateTime 转 Date
        Date updateTime = Date.from(
                LocalDateTime.now()
                        .atZone(ZoneId.systemDefault())
                        .toInstant()
        );
        sysRegistryTime.setUpdateTime(updateTime); // 此时与父类 Date 类型匹配
        return sysRegistryTimeMapper.updateSysRegistryTime(sysRegistryTime);
    }

    /**
     * 批量删除注册时间段配置
     *
     * @param ids 需要删除的主键集合
     * @return 结果
     */
    @Override
    public int deleteSysRegistryTimeByIds(Long[] ids) {
        return sysRegistryTimeMapper.deleteSysRegistryTimeByIds(ids);
    }

    /**
     * 删除注册时间段配置信息
     *
     * @param id 注册时间段配置主键
     * @return 结果
     */
    @Override
    public int deleteSysRegistryTimeById(Long id) {
        return sysRegistryTimeMapper.deleteSysRegistryTimeById(id);
    }
}
